#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;

void PrintPending(sigset_t pending)
{
    for(int i=31;i>=1;i--)
    {
        if(sigismember(&pending,i))
        {
            cout<<1;
        }
        else
        {
            cout<<0;
        }
    }
    cout<<endl;
}
void handler(int signo)
{
    cout<<"catch a signo: "<<signo<<endl;
}
int main()
{
    //0. 对2号信号进行捕捉
    signal(2,handler);
    //1.发送2号信号进行屏蔽 ———数据预备
    sigset_t bset,oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset,2); //我们已经把2号信号屏蔽了吗？ 并没有设置进入到进程的task_struct中，只是在用户区

    //1.2 调用系统调用，将数据设置进内核
    sigprocmask(SIG_SETMASK,&bset,&oset);   //此时就把2号信号屏蔽了

    //2.重复打印当前进程的pending 00000000000000000000000000000000
    sigset_t pending;
    int cnt=0;
    while(true)
    {
        //2.1 获取
        int n=sigpending(&pending);
        if(n<0) continue;
        //2.2 打印
        PrintPending(pending);
        sleep(1);
        cnt++;
        //2.3 解除阻塞
        if(cnt==20)
        {
            cout<<"unlock 2 signo"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);
        }
    }
    //3. 发送2号 00000000000000000000000000000010
    return 0;
}